﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using AgriMarketWebProj.AgriMarketService;
using System.Web.Script.Serialization;
using System.IO;
using AgriMarketWebProj.Models;
namespace AgriMarketWebProj.Controllers
{
    public class AuctionAdminController : Controller
    {
        //
        // GET: /AuctionAdmin/
        public ActionResult CheckLogIn_Require()
        {
            AgriMarketWebService service = new AgriMarketWebService();
            UserAccount userAccount = null;
            if (Session["CurrentUserAccount"] != null)
            {
                userAccount = service.GetUserAccountByUserName(Session["CurrentUserAccount"].ToString());
                ViewBag.CurrentUserAccount = userAccount;
                if (userAccount.TypeOfUser.TypeId != AdminCode.AdminTypeCode)
                    return Content("Bạn không có quyền truy cập!");
                return null;
            }
            else
            {
                TempData["ReturnUrl"] = Request.Url.PathAndQuery;
                return RedirectToAction("LogIn", "UserAccount");
            }
        }
        public void CheckLogIn_NoRequire()
        {
            AgriMarketWebService service = new AgriMarketWebService();
            UserAccount userAccount = null;
            if (Session["CurrentUserAccount"] != null)
            {
                userAccount = service.GetUserAccountByUserName(Session["CurrentUserAccount"].ToString());
                ViewBag.CurrentUserAccount = userAccount;
            }
        }
        public ActionResult Index()
        {
            AgriMarketWebService service=new AgriMarketWebService();
            ActionResult actionResult = CheckLogIn_Require();
            if (actionResult != null)
                return actionResult;
            IEnumerable<Auction> auctions=service.GetAllUnfinishedBuyAuctions();
            return View("Index",auctions);
        }

        //
        // GET: /AuctionAdmin/Details/5

        public ActionResult Details(int id)
        {
            return View();
        }

        //
        // GET: /AuctionAdmin/Create

        public ActionResult Create()
        {
            AgriMarketWebService service = new AgriMarketWebService();
            ActionResult actionResult = CheckLogIn_Require();
            if (actionResult != null)
                return actionResult;
            List<Product> allProducts = service.GetAllProducts().ToList();
            List<TypeOfAuction> allTypes = service.GetAllTypeOfAuction().ToList();
            ViewBag.AllProducts = allProducts;
            ViewBag.AllTypeOfAuctions = allTypes;
            return View("AddAuction");
        } 

        //
        // POST: /AuctionAdmin/Create

        [HttpPost]
        public ActionResult Create(FormCollection collection, HttpPostedFileBase ProductImageFile)
        {
            AgriMarketWebService service = new AgriMarketWebService();
            ActionResult actionResult = CheckLogIn_Require();
            if (actionResult != null)
                return actionResult;
            try
            {
                // TODO: Add insert logic here
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                // TODO: Add update logic here
                bool isOK = true;
                string message = "";

                string topic = collection["Topic"];
                if (topic.Trim() == "")
                {
                    ModelState.AddModelError("Topic", "Chủ đề vẫn còn trống");
                    isOK = false;
                }

                int typeId=-1;
                if (!int.TryParse(collection["TypeOfAuctionId"], out typeId))
                {
                    ModelState.AddModelError("TypeOfAuctionId", "Kiểu đấu giá bị lỗi");
                    isOK = false;
                }
                TypeOfAuction typeAuction = service.GetTypeOfAuctionById(typeId);
                if (typeAuction == null)
                {
                    ModelState.AddModelError("TypeError", "Kiểu đấu giá không tồn tại");
                    isOK = false;
                }
                DateTime startedDate;
                if (!DateTime.TryParse(collection["StartedDate"], out startedDate))
                {
                    ModelState.AddModelError("StartedDate", "Thời điểm bắt đầu đấu giá không hợp lệ");
                    isOK = false;
                }
                if (startedDate < DateTime.Today.AddDays(1)) {
                    ModelState.AddModelError("StartedDate1", "Thời điểm bắt đầu phải cách thời gian đăng ít nhất 1 ngày");
                    isOK = false;
                }
                DateTime finishedDate;
                if (!DateTime.TryParse(collection["FinishedDate"], out finishedDate))
                {
                    ModelState.AddModelError("FinishedDate", "Thời điểm kết thúc đấu giá không hợp lệ");
                    isOK = false;
                }

                if (finishedDate<=startedDate)
                {
                    ModelState.AddModelError("FinishedDateError", "Thời gian bắt đầu phải sau thời gian kết thúc");
                    isOK = false;

                }

                decimal initialPrice;
                if (!decimal.TryParse(collection["InitialPrice"], out initialPrice))
                {
                    ModelState.AddModelError("InitialPrice", "Giá khởi đầu không hợp lệ");
                    isOK = false;
                }


                Product product = service.GetProductById(int.Parse(collection["ProductId"]));

                string description = collection["ProductDescription"];
                if (description.Trim() == "")
                {
                    ModelState.AddModelError("ProductDescription", "Chưa có nội dung mô tả");
                    isOK = false;
                }

                string userAccName = collection["AuthorId"];

                if (userAccName.Trim() == "")
                {
                    ModelState.AddModelError("UserName", "Thiếu thông tin người đăng bài");
                    isOK = false;
                }

                UserAccount userAcc = service.GetUserAccountByUserName(userAccName);

                if (userAcc == null)
                {
                    ModelState.AddModelError("UserAccount", "Thiếu thông tin người đăng bài");
                    isOK = false;
                }

                string imageFileName = "";

                byte[] imageBytes = null;

                if (ProductImageFile != null)
                {
                    imageBytes = new byte[ProductImageFile.ContentLength];
                    ProductImageFile.InputStream.Read(imageBytes, 0, ProductImageFile.ContentLength);
                    imageFileName = ProductImageFile.FileName;
                }
                else
                {
                    string filePath = System.Web.Hosting.HostingEnvironment.MapPath("~/Content/TempProductImage.jpg");
                    FileInfo fileInfo = new FileInfo(filePath);

                    FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);

                    BinaryReader binaryReader = new BinaryReader(fileStream);
                    imageBytes = binaryReader.ReadBytes((int)fileInfo.Length);
                    binaryReader.Close();

                    imageFileName = "TempProductImage.jpg";
                }

                if (isOK)
                {
                    Auction newSellAuction = new Auction()
                    {
                        Topic = topic,
                        PostedDate = DateTime.Now,
                        StartedDate = startedDate,
                        FinishedDate = finishedDate,
                        InitialPrice = initialPrice,
                        Product = product,
                        ProductDescription = description,
                        AuthorId = userAccName,
                        ProductImageBytes = imageBytes,
                        ProductImage = imageFileName,
                        Type = typeAuction
                    };
                    int state = service.AddNewAuction(newSellAuction);
                    if (state == -1)
                    {
                        ModelState.AddModelError("Error", "Thao tác bị lỗi");
                        List<Product> allProducts = service.GetAllProducts().ToList();
                        List<TypeOfAuction> allTypes = service.GetAllTypeOfAuction().ToList();
                        ViewBag.AllProducts = allProducts;
                        ViewBag.AllTypeOfAuctions = allTypes;
                        return View("AddAuction");
                    }
                    else
                    {
                        IEnumerable<Auction> auctions = service.GetAllUnfinishedBuyAuctions();
                        return View("Index", auctions);
                    }
                }
                else
                {
                    List<Product> allProducts = service.GetAllProducts().ToList();
                    List<TypeOfAuction> allTypes = service.GetAllTypeOfAuction().ToList();
                    ViewBag.AllProducts = allProducts;
                    ViewBag.AllTypeOfAuctions = allTypes;
                    return View("AddAuction");
                }
                
            }
            catch
            {
                return RedirectToAction("Index");
            }
        }
        
        //
        // GET: /AuctionAdmin/Edit/5
 
        public ActionResult Edit(int id)
        {
            AgriMarketWebService service = new AgriMarketWebService();
            ActionResult actionResult = CheckLogIn_Require();
            if (actionResult != null)
                return actionResult;
            Auction auction = service.GetAuctionById(id);
            List<Product> allProducts = service.GetAllProducts().ToList();
            List<TypeOfAuction> allTypes = service.GetAllTypeOfAuction().ToList();
            ViewBag.AllProducts = allProducts;
            ViewBag.AllTypeOfAuctions = allTypes;
            if (allProducts.Count != 0 && allTypes.Count != 0)
            {
                if (auction != null)
                {
                    return View("EditAuction", auction);
                }
            }
            return Content("Không tìm thấy đối tượng");
        }

        //
        // POST: /AuctionAdmin/Edit/5

        [HttpPost]
        public ActionResult Edit(FormCollection collection, HttpPostedFileBase ProductImageFile)
        {
            
            try
            {
                AgriMarketWebService service = new AgriMarketWebService();
                ActionResult actionResult = CheckLogIn_Require();
                if (actionResult != null)
                    return actionResult;
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                // TODO: Add update logic here
                bool isOK = true;
                string message = "";

                int auctionId = int.Parse(collection["AuctionId"]);

                string topic = collection["Topic"];
                if (topic.Trim() == "")
                {
                    message += "Chủ đề vẫn còn trống\n";
                    ModelState.AddModelError("Topic", "Chủ đề vẫn còn trống");
                    isOK = false;
                }

                DateTime startedDate;
                if (!DateTime.TryParse(collection["StartedDate"], out startedDate))
                {
                    message += "Thời điểm bắt đầu đấu giá không hợp lệ\n";
                    ModelState.AddModelError("StartedDate", "Thời điểm bắt đầu đấu giá không hợp lệ");
                    isOK = false;
                }
                if (startedDate < DateTime.Today.AddDays(1))
                {
                    ModelState.AddModelError("StartedDate1", "Thời điểm bắt đầu phải cách thời gian đăng ít nhất 1 ngày");
                    isOK = false;
                }
                DateTime finishedDate;
                if (!DateTime.TryParse(collection["FinishedDate"], out finishedDate))
                {
                    message += "Thời điểm kết thúc đấu giá không hợp lệ\n";
                    ModelState.AddModelError("FinishedDate", "Thời điểm kết thúc đấu giá không hợp lệ");
                    isOK = false;
                }
                if (finishedDate.CompareTo(startedDate) <= 0)
                {
                    message += "Thời gian bắt đầu phải sau thời gian kết thúc\n";
                    isOK = false;

                }
                decimal initialPrice;
                if (!decimal.TryParse(collection["InitialPrice"], out initialPrice))
                {
                    message += "Giá khởi đầu không hợp lệ\n";
                    ModelState.AddModelError("InitialPrice", "Giá khởi đầu không hợp lệ");
                    isOK = false;
                }
                Product product = service.GetProductById(int.Parse(collection["ProductId"]));

                string description = collection["ProductDescription"];
                if (description.Trim() == "")
                {
                    message += "Chưa có nội dung mô tả\n";
                    ModelState.AddModelError("ProductDescription", "Chưa có nội dung mô tả");
                    isOK = false;
                }

                string userAccName = collection["AuthorId"];

                if (userAccName.Trim() == "")
                {
                    message += "Thiếu thông tin người đăng bài\n";
                    ModelState.AddModelError("UserName", "Thiếu thông tin người đăng bài");
                    isOK = false;
                }

                UserAccount userAcc = service.GetUserAccountByUserName(userAccName);

                if (userAcc == null) {
                    message += "Người đăng bài không tồn tại\n";
                    ModelState.AddModelError("UserAccount", "Thiếu thông tin người đăng bài");
                    isOK = false;
                }
                byte[] imageBytes = null;
                string imageFileName = collection["ProductImageName"];
                if (ProductImageFile != null)
                {
                    imageBytes = new byte[ProductImageFile.ContentLength];
                    ProductImageFile.InputStream.Read(imageBytes, 0, ProductImageFile.ContentLength);
    
                }
                int typeId = int.Parse(collection["TypeOfAuctionId"]);
                TypeOfAuction typeOfAuction = service.GetTypeOfAuctionById(typeId);
                if (typeOfAuction == null) {
                    message += "Kiểu đấu giá không tồn tại\n";
                    ModelState.AddModelError("TypeOfAuction", "Kiểu đấu giá không tồn tại");
                    isOK = false;    
                }

                if (isOK)
                {
                    Auction updatedAuction = new Auction()
                    {
                        AuctionId=auctionId,
                        Topic = topic,
                        PostedDate = DateTime.Now,
                        StartedDate = startedDate,
                        FinishedDate = finishedDate,
                        InitialPrice = initialPrice,
                        Product = product,
                        ProductDescription = description,
                        AuthorId = userAccName,
                        ProductImageBytes = (imageBytes == null) ? null : imageBytes,
                        ProductImage = imageFileName,
                        Type = typeOfAuction
                    };
                    int state = service.UpdateAuction(updatedAuction);
                    if(state!=0)
                        ModelState.AddModelError("Error", "Load dữ liệu thất bại");
                    else
                        return RedirectToAction("Index");
                }
                Auction auction = service.GetAuctionById(auctionId);
                List<Product> allProducts = service.GetAllProducts().ToList();
                List<TypeOfAuction> allTypes = service.GetAllTypeOfAuction().ToList();
                ViewBag.AllProducts = allProducts;
                ViewBag.AllTypeOfAuctions = allTypes;
                if(auction==null||allProducts.Count==0||allTypes.Count==0)
                    ModelState.AddModelError("Error", "Load dữ liệu thất bại");
                return View("EditAuction", auction);
                //return View("EditAuction", service.GetAuctionById(auctionId));
            }
            catch
            {
                return RedirectToAction("Edit");
            }
        }

        //
        // GET: /AuctionAdmin/Delete/5
 
        public ActionResult Delete(int id)
        {
            AgriMarketWebService service = new AgriMarketWebService();
            ActionResult actionResult = CheckLogIn_Require();
            if (actionResult != null)
                return actionResult;
            int state=service.DeleteAuction(id);
            return RedirectToAction("Index");
        }

        //
        // POST: /AuctionAdmin/Delete/5

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add delete logic here
                
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
    }
}
